S3へのアクセスにEndpointが利用されているかS3サーバーアクセスログより確認してみた
S3へのアクセスにVPC Endpointが利用されているかS3サーバーアクセスログより確認してみたいと思います。VPC Endpointが利用されていれば、ロギングされるアクセス元IPが変化すると思いますので、インターネットゲートウェイ経由、VPC Endpoint経由で確認してみました。
やってみた
インターネットゲートウェイ経由
まずはインターネットゲートウェイ経由ということで、VPC Endpoint作成前にS3へアクセスし、S3サーバーアクセスログを確認してみたいと思います。ここでは、ログ出力を有効にしたデータ保存用のバケットtestdata2020
と、ログ出力先バケットtestlog2020
を用意しました。
% aws s3 ls | grep '.*test.*2020' 2020-02-08 12:16:29 testdata2020 2020-02-08 12:16:29 testlog2020
アクセス元は以下のEC2となります。プライベートIPは10.0.1.179
で、パブリックIPは52.192.12.142
となります。
アクセス元EC2にて、適当なファイル(test.txt
)を作成しておき、以下コマンドでデータ保存バケットにアクセスしました。
[ec2-user@ip-10-0-1-179 ~]$ date;aws s3 cp test.txt s3://testdata2020;aws s3 ls s3://testdata2020;date 2020年 2月 8日 土曜日 03:56:41 UTC upload: ./test.txt to s3://testdata2020/test.txt 2020-02-08 03:56:43 5 test.txt 2020年 2月 8日 土曜日 03:56:44 UTC
S3サーバーアクセスログを確認します。ここでは、Athenaを利用し確認してみたいと思います。AthenaでS3サーバーアクセスログを解析する際は以下が参考になります。
Athenaで作成したテーブルに対し、Request-URI
とkey
を検索条件にした以下のクエリを実行しました。
SELECT bucket,requestdatetime,remoteip,key,requesturi_operation,httpstatus FROM s3_access_logs_db.mybucket_logs where requesturi_operation = 'PUT' AND key = 'test.txt' ORDER BY requestdatetime DESC
クエリの実行結果です。
"bucket","requestdatetime","remoteip","key","requesturi_operation","httpstatus" "testdata2020","08/Feb/2020:03:56:42 +0000","52.192.12.142","test.txt","PUT","200"
S3サーバアクセスログのremoteip
フィールドに、EC2のパブリックIP(52.192.12.142
)が出力されました。
なお、S3サーバアクセスログの出力はベストエフォートになりますので、クエリ結果が出力されない場合はしばらく時間をおいて再度実行してみてください。詳細については以下をご確認ください。
VPC Endpoint経由
VPC Endpointを作成しました、S3のEndpointはGatewayとなりますのでルーティングも設定されています。
VPC Endpoint
ルートテーブル
データ保存バケットにアクセスしてみます。
[ec2-user@ip-10-0-1-179 ~]$ date;aws s3 rm s3://testdata2020/test.txt;aws s3 ls s3://testdata2020;date 2020年 2月 8日 土曜日 10:44:19 UTC delete: s3://testdata2020/test.txt 2020年 2月 8日 土曜日 10:44:21 UTC
さきほど同様、Athenaで確認します。今回はファイル削除を行ったので、requesturi_operation
を変更しています。
SELECT bucket,requestdatetime,remoteip,key,requesturi_operation,httpstatus FROM s3_access_logs_db.mybucket_logs where requesturi_operation = 'DELETE' AND key = 'test.txt' ORDER BY requestdatetime DESC
クエリの実行結果です。
"bucket","requestdatetime","remoteip","key","requesturi_operation","httpstatus" "testdata2020","08/Feb/2020:10:44:20 +0000","10.0.1.179","test.txt","DELETE","204"
S3サーバアクセスログのremoteip
フィールドに、EC2のプライベートIP(10.0.1.179
)が出力されました。
おまけ
CloudTrailからもアクセス元IPが確認できそうなので、上記確認を終えた後、データ保存用バケットを削除し、CloudTrailの出力イベントを確認してみました。
[ec2-user@ip-10-0-1-179 ~]$ date;aws s3 rb s3://testdata2020;date 2020年 2月 8日 土曜日 13:03:47 UTC remove_bucket: testdata2020 2020年 2月 8日 土曜日 13:03:49 UTC
CloudTrailへは通常、API呼び出しから15分以内に出力されると思います。以下、バケット削除のログです。
ログの詳細は以下となります。
{ "eventVersion": "1.05", "userIdentity": { "type": "AssumedRole", "principalId": "AROAVWTKLCOCEJGM3AJXF:i-0ccfa4af412d1955c", "arn": "arn:aws:sts::XXXXXXXXXXXX:assumed-role/test-bastion-role/i-0ccfa4af412d1955c", "accountId": "XXXXXXXXXXXX", "accessKeyId": "ASIAVWTKLCOCANH6L575", "sessionContext": { "attributes": { "mfaAuthenticated": "false", "creationDate": "2020-02-08T12:54:02Z" }, "sessionIssuer": { "type": "Role", "principalId": "AROAVWTKLCOCEJGM3AJXF", "arn": "arn:aws:iam::XXXXXXXXXXXX:role/test-bastion-role", "accountId": "XXXXXXXXXXXX", "userName": "test-bastion-role" } } }, "eventTime": "2020-02-08T13:03:48Z", "eventSource": "s3.amazonaws.com", "eventName": "DeleteBucket", "awsRegion": "ap-northeast-1", "sourceIPAddress": "10.0.1.179", "userAgent": "[aws-cli/1.16.102 Python/2.7.16 Linux/4.14.152-127.182.amzn2.x86_64 botocore/1.12.92]", "requestParameters": { "host": [ "testdata2020.s3.ap-northeast-1.amazonaws.com" ], "bucketName": "testdata2020" }, "responseElements": null, "additionalEventData": { "SignatureVersion": "SigV4", "CipherSuite": "ECDHE-RSA-AES128-GCM-SHA256", "AuthenticationMethod": "AuthHeader", "vpcEndpointId": "vpce-0126d8067633b9fc0" }, "requestID": "C999CDB6A92BC4D3", "eventID": "ef9e6e39-6a3d-438a-80e6-b2a8c0da1fa8", "eventType": "AwsApiCall", "recipientAccountId": "XXXXXXXXXXXX", "vpcEndpointId": "vpce-0126d8067633b9fc0" }
アクセス元IPにEC2のプライベートIP(10.0.1.179
)が出力され、利用されたVPC Endpointも確認できました。
なお、設定を行えばS3オブジェクトのPutやDeleteといった操作もCloudTrailから確認することができます。オブジェクトレベルの記録を有効にする場合は、以下が参考になります。
さいごに
S3へのアクセスがインターネットゲートウェイ経由の場合、アクセス元はパブリックIPが記録され、VPC Endpoint経由ではプライベートIPが記録されました。CloudTrailではVPC EndpointのIDも確認できました。S3へのアクセスにVPC Endpointが利用されているか確認する際の参考になれば幸いです。